/*
 * Clase cIfxCnx_BDServidor para la conexion con la BD del servidor (SQLServer 2008)
 * contiene los metodos para insertar, consultar y actualizar 
 * datos y todo lo referente a la BD de caja.
 * 
 */

/*
 * cIfxCnx_BDServidor.java
 *
 * Created on 24-oct-2011, 18:29:18
 */
package pkgIfx_Conexiones;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import pkg1ifxArchivos.caDatosTemplate;
import pkg1ifxClienteTcp.cifxCliente;
import pkg1ifxArchivos.cifxLogs;
import adirector.cIfxDatosTemplate;
/**
 *
 * @author Johan Agustin Bayona Camargo 3012328016
 */
public class cIfxBD_Servidor {
//Variables Generales de la Clase    
    cifxLogs log;
    cifxCliente concliente;
    String serverName,portNumber,databaseName,userName,password;
    private final String selectMethod = "cursor";
    private final String url = "jdbc:sqlserver://";
          
    private void cargarparametros(){
        serverName = "172.16.1.196";
        portNumber = "1433";
        databaseName = "caja";
        userName = "sa";//cifrar.descifrarPalabra(data[3]);
        password = "4dm1nSA2011";//cifrar.descifrarPalabra(data[4]);
    }
    
    public cIfxBD_Servidor(cifxLogs Log){
        log = Log;
    }
//metodo de conexion a la BD datos del Servidor
    private Connection ServConexion() throws Exception
    {   
        cargarparametros();
        Connection con = null;
        try{
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            DriverManager.setLoginTimeout(6);
            con = DriverManager.getConnection(url+serverName+":"+portNumber+";databaseName="+databaseName+";selectMethod="+selectMethod+";",userName,password);
        }catch(SQLException ex1){
            log.outMensaje("Error SQLException cIfxCnx_BDServidor, conexion SqlServer, "+ex1);
        }catch (ClassNotFoundException ex2){
            log.outMensaje("Error ClassNotFoundException cIfxCnx_BDServidor, conexion SqlServer, "+ex2);
        }catch(Exception ex3){
            log.outMensaje("Error Exception cIfxCnx_BDServidor, conexion SqlServer, "+ex3);
        }
        return con;
    }
//Metodo count para obtener el numero de Afiliados de la BD del Servidor
    public int count() {
        int retorna = -1;
        PreparedStatement stmt2 = null; //statement para el sql
        try {
            Connection con = ServConexion();
            stmt2 = con.prepareStatement("SELECT COUNT (*) afi_identificacion FROM afi_afiliado");
            ResultSet rs2 = stmt2.executeQuery();
            rs2.next();
            retorna = rs2.getInt(1);
            rs2.close();
            con.close();
        }
        catch (Exception e) {
            log.outMensaje("Error validarusuario cIfxCnx_DBGeneral, "+e);
            retorna = -1;
        }
        return retorna;
    }
//Valida la conexion retornando un true si encuentra resouesta por parte de la Base de Datos del Servidor     
    public boolean validaconexion() {
        try {
            Connection con = ServConexion();
            con.close();
        }catch (Exception e){
            log.outMensaje("Error en consulta de cedula BD del Servidor: "+e);
            return false;
        }
        return true;
    }
//Valida la existencio o no de un afiliado retornando un true si lo encuentra en la Datos del Servidor      
    public boolean busqueda_serv_boolean(String cedulaBus) throws SQLException
    {
        String consulta = "";
        boolean estado = false;
        PreparedStatement stmt = null; //statement para el sql
        try {
            Connection con = ServConexion();
            stmt = con.prepareStatement("SELECT * FROM afi_afiliado where afi_identificacion = "+cedulaBus+"");
            ResultSet rs = stmt.executeQuery();
            rs.next();
            consulta = rs.getString(1);
            if(consulta.equals("")) estado = false;
            else estado = true;
            rs.close();
            con.close();
        }catch (Exception e){
            log.outMensaje("Error en consulta de cedula BD del Servidor: "+e);
            return estado;
        }
        return estado;
    }
    
    public String[] ConsultarAfiliado(String cedulaBus) throws SQLException
    {
        String consulta[] = new String[20];
        PreparedStatement stmt = null; //statement para el sql
        try {
            Connection con = ServConexion();
            stmt = con.prepareStatement("SELECT * FROM afi_afiliado where afi_identificacion = "+cedulaBus+"");
            ResultSet rs = stmt.executeQuery();
            while (rs.next())
            {
                for (int row = 0; row <= 19; row++) {
                    consulta[row] = rs.getString(row+1);
                }
            }
            rs.close();
            con.close();
        }catch (Exception e){
            log.outMensaje("Error en consulta de cedula BD del Servidor: "+e);
        }
        return consulta;
     }
//Almacenar Nuevo Afiliado en BD Servidor    
    public void NuevoAfiliado(
    int id,
    String cedula,
    int TipoDoc,
    String P_Apellido,
    String S_Apellido,
    String P_Nombre,
    String S_Nombre,
    String Fecha,
    String Ciudad,
    String Departamento,
    String FechaExp,
    String CiudadExp,
    String DepartamentoExp,
    int Sexo,
    int EstadoCivil,
    int EstadoAfiliado,
    int Id_afiliado,
    String Observacion,
    String Senales,
    String Perfil)
    {
        if(Fecha != null) Fecha = "'"+Fecha+"'";
        if(FechaExp  != null) FechaExp = "'"+FechaExp+"'";
        try {
            Connection con = ServConexion();
            PreparedStatement pstmt = con.prepareStatement("Select MAX(afi_afiliados_id) as maximo from afi_afiliado");
            ResultSet rs= pstmt.executeQuery();
            rs.next();
            int maxID = rs.getInt(1) + 1;
            pstmt = con.prepareStatement("INSERT INTO afi_afiliado (afi_afiliados_id,afi_identificacion,cat_tipo_id,"
            + "afi_primer_apellido,afi_segundo_apellido,afi_primer_nombre,afi_segundo_nombre,"
            + "afi_fecha_nacimiento,cat_afi_ciudad_nacimiento,cat_afi_dpto_nacimiento,"
            + "afi_fecha_expedicion_documento,cat_afi_ciudad_expedicion_documento,"
            + "cat_afi_dpto_expedicion_documento,cat_afi_sexo,cat_afi_estado_afiliado,afi_perfil) VALUES ("
            +maxID+","
            +cedula+","            // 2
            +TipoDoc+","           // 3
            + "'"+P_Apellido+"',"        // 4
            + "'"+S_Apellido+"',"        // 5
            + "'"+P_Nombre+"',"          // 6
            + "'"+S_Nombre+"',"          // 7
            + ""+Fecha+","             // 8//STR-09mar2011
            + "'"+Ciudad+"',"           // 9
            + "'"+Departamento+"',"      // 10
            + ""+FechaExp+","         // 11 //STR-09mar2011
            + "'"+CiudadExp+"',"         // 12
            + "'"+DepartamentoExp+"',"   // 13
            + Sexo+","              // 14
            +0+","              // 15
            + "'"+Perfil+"')");    // 16
            pstmt.execute();
            rs.close();
            con.close();
        }catch (Exception ex) {
            log.outMensaje("Clase RcordDBServidor, NuevoAfiliado insertando nuevo afiliado : "+ ex);
        }
    }
    
    public void Nuevo_bio_informacion (String ced_usuario,String nombre,String departamento,String municipio,String unidad,
        String cedula_afi,int tipo_id,String P_Apellido,String S_Apellido,String P_Nombre,String S_Nombre,
        String Fecha,String Departamento,String Ciudad,String FechaExp,String DepartamentoExp,String CiudadExp,
        int Sexo,String Perfil,String fuerza,String fechaenrolamiento,String firma,String cedula,String huella,
        String rostro,String iris,String equipo){
        try {
            if(Fecha != null) Fecha = "'"+Fecha+"'";
            if(FechaExp  != null) FechaExp = "'"+FechaExp+"'";
            Connection con = ServConexion();
            PreparedStatement pstmt = con.prepareStatement("INSERT INTO biocaptura_informacion (BIO_USUARIO_ID,BIO_NOMBRE_USUARIO,"
            + "BIO_DEPARTAMENTO,BIO_MUNICIPIO,BIO_UNIDAD,BIO_AFI_IDENTIFICACION,BIO_TIPO_ID_AFI,BIO_AFI_PRIMER_APELLIDO,BIO_AFI_SEGUNDO_APELLIDO,"
            + "BIO_AFI_PRIMER_NOMBRE,BIO_AFI_SEGUNDO_NOMBRE,BIO_FECHA_NACIMIENTO,BIO_DEPT_NACIMIENTO,BIO_MUNICIPIO_NACIMIENTO,"
            + "BIO_FECHA_EXPEDICION_DOC,BIO_DEPT_EXPEDICION_DOC,BIO_MUNICIPIO_EXPEDICION,BIO_AFI_SEXO,BIO_AFI_PERFIL,BIO_FUERZA,"
            + "BIO_AFI_FECHA_ENROLAMIENTO,BIO_FIRMA,BIO_CEDULA,BIO_HUELLA,BIO_ROSTRO,BIO_IRIS,BIO_EQUIPO) VALUES ("
            +ced_usuario+","            // 2
            +"'"+nombre+"',"           // 3
            +"'"+departamento+"',"
            +"'"+municipio+"',"
            +"'"+unidad+"',"
            +cedula_afi+","
            +tipo_id+","
            + "'"+P_Apellido+"',"        // 4
            + "'"+S_Apellido+"',"        // 5
            + "'"+P_Nombre+"',"          // 6
            + "'"+S_Nombre+"',"          // 7
            + ""+Fecha+","             // 8//STR-09mar2011
            + "'"+Departamento+"',"           // 9
            + "'"+Ciudad+"',"      // 10
            + ""+FechaExp+","         // 11 //STR-09mar2011
            + "'"+DepartamentoExp+"',"         // 12
            + "'"+CiudadExp+"',"   // 13
            + Sexo+","
            + "'"+Perfil+"',"
            + "'"+fuerza+"',"
            + "'"+fechaenrolamiento+"',"
            + "'"+firma+"',"
            + "'"+cedula+"',"
            + "'"+huella+"',"
            + "'"+rostro+"',"
            + "'"+iris+"',"
            + "'"+equipo+"')");    // 16
            pstmt.execute();
            con.close();
        }catch(Exception ex){
            log.outMensaje("Clase RcordDBServidor, Nuevo_bio_informacion insertando informacion : "+ ex);
        }
    }
// Guardar el template de una huella en la BD en el Servidor
    public void almacenar_Huella (caDatosTemplate odatostemplate) throws Exception
    {
        PreparedStatement pstmt;
        ResultSet rs;
        for(int i=0; i < odatostemplate.getTemplate().length; i++)
        {
            try
            {
                Connection con = ServConexion();
                pstmt = con.prepareStatement("Select MAX(Id) as maximo from Finger_Templates");
                rs= pstmt.executeQuery();
                rs.next();
                int maxID = rs.getInt(1)+ 1;
                byte[] pngimage = null;
                pstmt = con.prepareStatement("INSERT INTO Finger_Templates VALUES (?,?,?,?)");
                pstmt.setInt(1, maxID);

                if (odatostemplate.getCedulas()[i] != null)
                pstmt.setString(2, odatostemplate.getCedulas()[i]);
                if (odatostemplate.getTemplate()[i].getTemplate() != null)
                {
                    pstmt.setBytes(3, odatostemplate.getTemplate()[i].getTemplate()); //setbytes(3,ofi.template);
                    odatostemplate.getTemplate()[i].Id=maxID;

                }
                
                if (pngimage == null)
                    pstmt.setBytes(4, null);

                pstmt.execute();


                rs.close();
                con.close();
            }catch (SQLException ex) {
                log.outMensaje("Clase RcordDBServidor, almacenar_Huella insertando template : "+ ex);
            }
        }
    }
// Guardar el template de Rostro en la BD en el Servidor    
    public void almacenar_Rostro (caDatosTemplate odatostemplate) throws Exception
    {
       PreparedStatement pstmt;
        ResultSet rs;
        for(int i=0; i < odatostemplate.getTemplate().length; i++)
        {
            try
            {
                Connection con = ServConexion();
                pstmt = con.prepareStatement("Select MAX(Id) as maximo from Face_Templates");
                rs= pstmt.executeQuery();
                rs.next();
                int maxID = rs.getInt(1)+ 1;
                byte[] pngimage = null;
                pstmt = con.prepareStatement("INSERT INTO Face_Templates VALUES (?,?,?,?)");
                pstmt.setInt(1, maxID);
                if (odatostemplate.getCedulas()[i] != null)
                    pstmt.setString(2, odatostemplate.getCedulas()[i]);
                if (odatostemplate.getTemplate()[i].getTemplate() != null)
                {
                    pstmt.setBytes(3, odatostemplate.getTemplate()[i].getTemplate()); //setbytes(3,ofi.template);
                    odatostemplate.getTemplate()[i].Id=maxID;

                }
                //if (odatostemplate.getTemplate()[i].getTemplate() != null)
                //pstmt.setBytes(3, odatostemplate.getTemplate()[i].getTemplate()); //setbytes(3,ofi.template);
                if (pngimage == null)
                    pstmt.setBytes(4, null);

                pstmt.execute();
                rs.close();
                con.close();
            }catch (SQLException ex) {
                log.outMensaje("Clase RcordDBServidor, almacenar_Rostro insertando template : "+ ex);
            }
        }
    }
//************************************************* Conexiones al AppAdministrador **********************************

//Almacenar Nuevo Afiliado en BD Servidor    
    public void NuevoAfiliado_Rechazado(
    int id,
    int cedula,
    int TipoDoc,
    String P_Apellido,
    String S_Apellido,
    String P_Nombre,
    String S_Nombre,
    String Fecha,
    String Ciudad,
    String Departamento,
    String FechaExp,
    String CiudadExp,
    String DepartamentoExp,
    int Sexo,
    int EstadoCivil,
    int EstadoAfiliado,
    int Id_afiliado,
    String Observacion,
    String Senales,
    String Perfil)
    {
        if(Fecha != null) Fecha = "'"+Fecha+"'";
        if(FechaExp  != null) FechaExp = "'"+FechaExp+"'";
        try {
            Connection con = ServConexion();
            PreparedStatement pstmt = con.prepareStatement("Select MAX(afi_afiliados_id) as maximo from afi_afiliado_Rechazados");
            ResultSet rs= pstmt.executeQuery();
            rs.next();
            int maxID = rs.getInt(1) + 1;
            pstmt = con.prepareStatement("INSERT INTO afi_afiliado_Rechazados (afi_afiliados_id,afi_identificacion,cat_tipo_id,"
            + "afi_primer_apellido,afi_segundo_apellido,afi_primer_nombre,afi_segundo_nombre,"
            + "afi_fecha_nacimiento,cat_afi_ciudad_nacimiento,cat_afi_dpto_nacimiento,"
            + "afi_fecha_expedicion_documento,cat_afi_ciudad_expedicion_documento,"
            + "cat_afi_dpto_expedicion_documento,cat_afi_sexo,cat_afi_estado_afiliado,afi_perfil) VALUES ("
            +maxID+","
            +cedula+","            // 2
            +TipoDoc+","           // 3
            + "'"+P_Apellido+"',"        // 4
            + "'"+S_Apellido+"',"        // 5
            + "'"+P_Nombre+"',"          // 6
            + "'"+S_Nombre+"',"          // 7
            + ""+Fecha+","             // 8//STR-09mar2011
            + "'"+Ciudad+"',"           // 9
            + "'"+Departamento+"',"      // 10
            + ""+FechaExp+","         // 11 //STR-09mar2011
            + "'"+CiudadExp+"',"         // 12
            + "'"+DepartamentoExp+"',"   // 13
            + Sexo+","              // 14
            +0+","              // 15
            + "'"+Perfil+"')");    // 16
            pstmt.execute();
            rs.close();
            con.close();
        }catch (Exception ex) {
            log.outMensaje("Clase RcordDBServidor, NuevoAfiliado_Rechazado insertando nuevo afiliado : "+ ex);
        }
    }
    
    public void Nuevo_bio_informacion_Rechazado (int ced_usuario,String nombre,String departamento,String municipio,String unidad,
        int cedula_afi,int tipo_id,String P_Apellido,String S_Apellido,String P_Nombre,String S_Nombre,
        String Fecha,String Departamento,String Ciudad,String FechaExp,String DepartamentoExp,String CiudadExp,
        int Sexo,String Perfil,String fuerza,String fechaenrolamiento,String firma,String cedula,String huella,
        String rostro,String iris,String equipo){
        try {
            if(Fecha != null) Fecha = "'"+Fecha+"'";
            if(FechaExp  != null) FechaExp = "'"+FechaExp+"'";
            Connection con = ServConexion();
            PreparedStatement pstmt = con.prepareStatement("INSERT INTO biocaptura_informacion_Rechazados (BIO_USUARIO_ID,BIO_NOMBRE_USUARIO,"
            + "BIO_DEPARTAMENTO,BIO_MUNICIPIO,BIO_UNIDAD,BIO_AFI_IDENTIFICACION,BIO_TIPO_ID_AFI,BIO_AFI_PRIMER_APELLIDO,BIO_AFI_SEGUNDO_APELLIDO,"
            + "BIO_AFI_PRIMER_NOMBRE,BIO_AFI_SEGUNDO_NOMBRE,BIO_FECHA_NACIMIENTO,BIO_DEPT_NACIMIENTO,BIO_MUNICIPIO_NACIMIENTO,"
            + "BIO_FECHA_EXPEDICION_DOC,BIO_DEPT_EXPEDICION_DOC,BIO_MUNICIPIO_EXPEDICION,BIO_AFI_SEXO,BIO_AFI_PERFIL,BIO_FUERZA,"
            + "BIO_AFI_FECHA_ENROLAMIENTO,BIO_FIRMA,BIO_CEDULA,BIO_HUELLA,BIO_ROSTRO,BIO_IRIS,BIO_EQUIPO) VALUES ("
            +ced_usuario+","            // 2
            +"'"+nombre+"',"           // 3
            +"'"+departamento+"',"
            +"'"+municipio+"',"
            +"'"+unidad+"',"
            +cedula_afi+","
            +tipo_id+","
            + "'"+P_Apellido+"',"        // 4
            + "'"+S_Apellido+"',"        // 5
            + "'"+P_Nombre+"',"          // 6
            + "'"+S_Nombre+"',"          // 7
            + ""+Fecha+","             // 8//STR-09mar2011
            + "'"+Departamento+"',"           // 9
            + "'"+Ciudad+"',"      // 10
            + ""+FechaExp+","         // 11 //STR-09mar2011
            + "'"+DepartamentoExp+"',"         // 12
            + "'"+CiudadExp+"',"   // 13
            + Sexo+","
            + "'"+Perfil+"',"
            + "'"+fuerza+"',"
            + "'"+fechaenrolamiento+"',"
            + "'"+firma+"',"
            + "'"+cedula+"',"
            + "'"+huella+"',"
            + "'"+rostro+"',"
            + "'"+iris+"',"
            + "'"+equipo+"')");    // 16
            pstmt.execute();
            con.close();
        }catch(Exception ex){
            log.outMensaje("Clase RcordDBServidor, Nuevo_bio_informacion_Rechazado insertando informacion : "+ ex);
        }
    }    
// Guarda Template de Huella en Rechazados por que el afiliado ya existe
    public void almacenar_Huella_Rechazado (cIfxDatosTemplate[] ofi) throws Exception
    {
        PreparedStatement pstmt;
        ResultSet rs;
        for(int i=0; i < ofi.length; i++)
        {
            try
            {
                Connection con = ServConexion();
                pstmt = con.prepareStatement("Select MAX(Id) as maximo from Finger_Templates_Rechazados");
                rs= pstmt.executeQuery();
                rs.next();
                int maxID = rs.getInt(1)+ 1;
                byte[] pngimage = null;
                pstmt = con.prepareStatement("INSERT INTO Finger_Templates_Rechazados VALUES (?,?,?,?)");
                pstmt.setInt(1, maxID);
                if (ofi[i].T_Template_Id != null)
                pstmt.setString(2, ofi[i].T_Template_Id);
                if (ofi[i].T_Template != null)
                pstmt.setBytes(3, ofi[i].T_Template); //setbytes(3,ofi.template);
                if (pngimage == null)
                pstmt.setBytes(4, null);
                pstmt.execute();
                rs.close();
                con.close();
                //conectar();
                //concliente.EnviarCmd("IFX-Fenix,Insertar,Huella|"+maxID);
            }
            catch (SQLException ex) {
                log.outMensaje("Clase RcordDBServidor, Finger_Templates_Rechazados insertando template : "+ ex);
            }
        }
    }
// Guardar el template de Rostro en la BD en el Servidor    
    public void almacenar_Rostro_Rechazado (cIfxDatosTemplate ofi) throws Exception
    {
        String T_Template_Id = ofi.T_Template_Id;
        byte[] T_Template = ofi.T_Template;

        PreparedStatement pstmt;
        ResultSet rs;
        try {
            Connection con = ServConexion();
            pstmt = con.prepareStatement("Select MAX(Id) as maximo from Face_Templates_Rechazados");
            rs= pstmt.executeQuery();
            rs.next();
            int maxID = rs.getInt(1) + 1;
            byte[] pngimage = null;
            pstmt = con.prepareStatement("INSERT INTO Face_Templates_Rechazados VALUES (?,?,?,?)");
            pstmt.setInt(1, maxID);
            if (T_Template_Id != null)
                pstmt.setString(2, T_Template_Id);
            if (T_Template != null)
                pstmt.setBytes(3, T_Template);
            if (pngimage == null)
                pstmt.setBytes(4, null);
            pstmt.execute();
            rs.close();
            con.close();
            //conectar();
            //concliente.EnviarCmd("IFX-Fenix,Insertar,Rostro|"+maxID);
        }
        catch (SQLException ex) {
            log.outMensaje("Clase RcordDBServidor, Face_Templates_Rechazados insertando template : "+ ex);
        }
    }
// Consilta en BD y etorna true si existe un template en Finger_Template    
    public boolean Finger_Exist(String Cedula){ // Esto esta comentareado por que se necesita indexar la tabla en la BD para que esto funcione 
//        String consulta = "";
//        PreparedStatement stmt = null; //statement para el sql
//        try {
//            Connection con = ServConexion();
//            stmt = con.prepareStatement("SELECT Template FROM [caja].[dbo].[Finger_Templates] where substring(TemplateId, 1, 10) = "+Cedula+"");
//            ResultSet rs = stmt.executeQuery();
//            rs.next();
//            consulta = rs.getString(1);
//            rs.close();
//            con.close();
//        }catch (Exception e){
//            log.outMensaje("Error en consulta de template de finger para el test, BD del Servidor: "+e);
//        }
//        if(consulta.equals(""))
//            return true;
        return false;
    }
// Consilta en BD y etorna true si existe un template en Face_Template     
    public boolean Face_Exist(String Cedula){
//        String consulta = "";
//        PreparedStatement stmt = null; //statement para el sql
//        try {
//            Connection con = ServConexion();
//            stmt = con.prepareStatement("SELECT Template FROM [caja].[dbo].[Face_Templates] where substring(TemplateId, 1, 10) = "+Cedula+"");
//            ResultSet rs = stmt.executeQuery();
//            rs.next();
//            consulta = rs.getString(1);
//            rs.close();
//            con.close();
//        }catch (Exception e){
//            log.outMensaje("Error en consulta de template de face para el test, BD del Servidor: "+e);
//        }
//        if(consulta.equals(""))
//            return true;
        return false;
    }
//Consulta desde la Id Huella    
    public String[] busqueda_serv(String cedulaBus) throws SQLException {
        String consulta[] = new String[20];
        PreparedStatement stmt = null; //statement para el sql
        try {
            Connection con = ServConexion();
            stmt = con.prepareStatement("SELECT * FROM afi_afiliado where afi_identificacion = "+cedulaBus+"");
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                for (int row = 0; row <= 19; row++) {
                    consulta[row] = rs.getString(row+1);
                }
            }
        rs.close();
        con.close();
        } catch (Exception e) {
            System.out.println("Error en consulta de cedula BD del Servidor: "+e);
            return consulta;
        }
        return consulta;
    }
}
